package com.ssy.lingxi.after.sale.service;

import com.ssy.lingxi.after.sale.model.vo.response.TaskStepVO;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.workflow.api.model.vo.request.*;
import com.ssy.lingxi.workflow.api.model.vo.response.ComplexTaskCompleteVO;
import com.ssy.lingxi.workflow.api.model.vo.response.ComplexTaskDefVO;
import com.ssy.lingxi.workflow.api.model.vo.response.SimpleProcessDefVO;
import com.ssy.lingxi.workflow.api.model.vo.response.SimpleTaskCompleteVO;

import java.util.List;

/**
 *  新工作流feign
 * @author ds
 * @date 2021/5/21
 * @version 2.0.0
 */
public interface IProcessFeignService {

    /**
     * （各种流程通用）启动流程
     * @param startVO 接口参数
     * @return 启动结果
     */
    Wrapper<ComplexTaskCompleteVO> startProcess(TaskStartVO startVO);

    /**
     * （各种流程通用）启动流程后，执行第一个Task
     * @param startVO 接口参数
     * @return 执行结果
     */
    Wrapper<ComplexTaskCompleteVO> startProcessThenCompleteFirstTask(TaskStartVO startVO);

    /**
     * （各种流程通用）执行流程步骤
     * @param executeVO 接口参数
     * @return 执行结果
     */
    Wrapper<ComplexTaskCompleteVO> completeTask(TaskExecuteVO executeVO);

    /**
     * 启动单一的外部流程或内部流程
     * @param startVO 接口参数
     * @return 启动结果
     */
    Wrapper<SimpleTaskCompleteVO> startSimpleProcess(TaskStartVO startVO);

    /**
     * 启动单一的外部流程或内部流程，并执行第一个步骤
     * @param startVO 接口参数
     * @return 执行结果
     */
    Wrapper<SimpleTaskCompleteVO> startSimpleProcessThenCompleteFirstTask(TaskStartVO startVO);

    /**
     * 执行单一的外部流程、或内部流程
     * @param executeVO 接口参数
     * @return 执行结果
     */
    Wrapper<SimpleTaskCompleteVO> completeSimpleTask(TaskExecuteVO executeVO);

    /**
     * 查询流程参数(dataId)列表
     * @param queryVO 接口参数
     * @return 参数列表
     */
    Wrapper<List<Long>> findProcessDataIds(ProcessDataQueryVO queryVO);

    /**
     * 查询复杂流程的任务定义
     * @param queryVO 接口参数
     * @return 查询结果
     */
    Wrapper<ComplexTaskDefVO> findComplexTaskDefinitions(ComplexProcessQueryVO queryVO);

    /**
     * 查询单一的外部流程的定义
     * @param queryVO 接口参数
     * @return 查询结果
     */
    Wrapper<SimpleProcessDefVO> findSimpleExternalTaskDefinitions(ExternalProcessQueryVO queryVO);

    /**
     * 查询单一的内部流程的定义
     * @param queryVO 接口参数
     * @return 查询结果
     */
    Wrapper<SimpleProcessDefVO> findSimpleInternalTaskDefinitions(InternalProcessQueryVO queryVO);

    /**
     * 查询任务步骤（内部）
     * @author ds
     * @date 2021/5/21
     * @param processEnum: 任务枚举值
     * @param taskId:任务id
     * @param memberId:会员id
     * @return 任务步骤
     **/
    List<TaskStepVO> listTaskStep(Integer processEnum, String taskId, Long memberId);
    /**
     * 查询任务步骤（外部）
     * @author ds
     * @date 2021/5/21
     * @param processEnum: 任务枚举值
     * @param taskId:任务id
     * @param subRoleId: 下级会员id（采购商）
     * @param roleId: 上级会员id（供应商）
     * @return 任务步骤
     **/
    List<TaskStepVO> listTaskStepOut(Integer processEnum, String taskId, Long subRoleId, Long roleId);


    /**
     * 启动单一的外部流程或内部流程
     * @param memberId
     * @param roleId
     * @param processEnum
     * @param dataId
     * @return
     */
    SimpleTaskCompleteVO startSimpleProcess(Long memberId, Long roleId, Integer processEnum, Long dataId);

}
